//
// Created by yonghu0 on 25-10-19.
//

#ifndef MONGODATABASE_H
#define MONGODATABASE_H

#include <atomic>
#include <mongocxx/instance.hpp>
#include <mongocxx/pool.hpp>
#include <mongocxx/client.hpp>
#include <jsoncpp/json/json.h>
#include "Config.h"

class MoDB
{
public:
    static MoDB *GetInstance();

    Json::Value RegisterUser(Json::Value registerjson);
    Json::Value LoginUser(Json::Value loginjson);
    Json::Value SelectUserInfo(Json::Value selectjson);
    Json::Value UpdateUser(Json::Value updatejson);
    Json::Value GetUserUpdateInfo(Json::Value getjson);
    Json::Value DeleteUser(Json::Value deletejson);
    Json::Value GetUserlistInfo(Json::Value getjson);
    Json::Value RankUser(Json::Value rankjson);
    Json::Value TokenLoginUser(Json::Value loginjson);
    bool UpdateUserProblemInfo(Json::Value &queryjson);
    Json::Value SelectUserAuthority();

    Json::Value SelectProblem(Json::Value queryjson);
    Json::Value SelectProblemList(Json::Value queryjson);
    Json::Value SelectProblemListByAdmin(Json::Value queryjson);
    Json::Value SelectProblemInfoByAdmin(Json::Value queryjson);
    Json::Value InsertProblem(Json::Value queryjson);
    Json::Value UpdateProblem(Json::Value queryjson);
    Json::Value DeleteProblem(Json::Value queryjson);
    bool UpdateProblemStatusNum(Json::Value &queryjson);
    Json::Value GetProblemTags();

    Json::Value SelectAnnouncementList(Json::Value queryjson);
    Json::Value SelectAnnouncementListByAdmin(Json::Value queryjson);
    Json::Value SelectAnnouncement(Json::Value queryjson);
    Json::Value SelectAnnouncementByEdit(Json::Value queryjson);
    Json::Value InsertAnnouncement(Json::Value queryjson);
    Json::Value UpdateAnnouncement(Json::Value queryjson);
    Json::Value DeleteAnnouncement(Json::Value queryjson);
    bool UpdateAnnouncementComments(Json::Value queryjson);

    Json::Value SelectDiscussList(Json::Value queryjson);
    Json::Value SelectDiscussListByAdmin(Json::Value queryjson);
    Json::Value SelectDiscuss(Json::Value queryjson);
    Json::Value SelectDiscussByEdit(Json::Value queryjson);
    Json::Value InsertDiscuss(Json::Value queryjson);
    Json::Value UpdateDiscuss(Json::Value queryjson);
    Json::Value DeleteDiscuss(Json::Value queryjson);
    Json::Value UpdateDiscussComments(Json::Value queryjson);

    Json::Value SelectSolutionList(Json::Value &queryjson);
    Json::Value SelectSolutionListByAdmin(Json::Value &queryjson);
    Json::Value SelectSolutionByEdit(Json::Value &queryjson);
    Json::Value SelectSolution(Json::Value &queryjson);
    Json::Value InsertSolution(Json::Value &queryjson);
    Json::Value UpdateSolution(Json::Value &queryjson);
    Json::Value DeleteSolution(Json::Value &queryjson);
    Json::Value UpdateSolutionComments(Json::Value &queryjson);

    Json::Value SelectCommentListByAdmin(Json::Value &queryjson);
    Json::Value GetFatherComment(Json::Value &queryjson);
    Json::Value GetSonComment(Json::Value &queryjson);
    Json::Value InsertFatherComment(Json::Value &queryjson);
    Json::Value InsertSonComment(Json::Value &queryjson);
    Json::Value DeleteFatherComment(Json::Value &queryjson);
    Json::Value DeleteSonComment(Json::Value &queryjson);
    bool DeleteArticleComment(Json::Value &queryjson);

    std::string InsertStatusRecord(Json::Value &queryjson);
    bool UpdateStatusRecord(Json::Value &queryjson);
    Json::Value SelectStatusRecordList(Json::Value &queryjson);
    Json::Value SelectStatusRecord(Json::Value &queryjson);

private:
    mongocxx::instance instance{};
    mongocxx::uri uri;
    mongocxx::pool pool;

    std::atomic_int64_t m_problemid{0};
    std::atomic_int64_t m_articleid{0};
    std::atomic_int64_t m_commentid{0};
    std::atomic_int64_t m_statusrecordid{0};

    MoDB();
    ~MoDB();

    int64_t GetMaxId(std::string name);
};


#endif //MONGODATABASE_H
